﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using DataAccessLayer;
using System.Configuration;
using System.Data;
using System.Net;
using System.IO;
using System.Net.Mail;
using System.Text.RegularExpressions;

namespace GUI.Common
{
    public class CommonClass
    {
        #region Phương thức khởi tạo mặc định
        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public CommonClass()
        {
            string connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            dbmanager = new DBManager(DataProvider.SqlServer, connectionInfo);
        }
        #endregion

        #region Phương thức kiểm tra 1 năm là nhuận hay ko
        /// <summary>
        /// Phương thức kiểm tra xem 1 năm có phải năm nhuận ko?
        /// </summary>
        /// <param name="nam">int - Năm cần kiểm tra</param>
        /// <returns>int - 1: Là năm nhuận | 0: Ko là năm nhuận</returns>
        public static int KiemTraNhuan(int nam)
        {
            // 1 năm là nhuận:
            // Năm chia hết cho 4 và ko chia hết cho 100
            // Năm chia hết cho 400

            if (nam % 4 == 0 && nam % 100 != 0)
                return 1;
            if (nam % 400 == 0)
                return 1;
            return 0;
        }
        #endregion

        #region Mã hóa password md5
        /// <summary>
        /// Phương thức này tham khảo trên internet
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string md5(string password)
        {
            //Kiểm tra tính hợp lệ của mật khẩu trước khi mã hóa
            //Declarations

            if (password == "")
            {
                return "";
            }
            //Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password)
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] originalBytes = ASCIIEncoding.Default.GetBytes(password);
            byte[] encodedBytes = md5.ComputeHash(originalBytes);
            //Convert encoded bytes back to a 'readable' string
            return BitConverter.ToString(encodedBytes);
        }
        #endregion

        #region Phương thức SaltPassword
        /// <summary>
        /// Phương thức SaltPassword
        /// Hàm này mục đích giúp cho việc mã hóa paswrod md5 được tốt hơn
        /// </summary>
        /// <param name="password">string - Chuỗi password</param>
        /// <returns>string - Chuỗi password đã được add salt</returns>
        public static string SaltPassword(string password)
        {
            //////////////////////////////////////////////////////////////////////////////
            // Quy tắt mã hóa password:
            // Lấy password user nhập vào đi phân tích
            // Salt head = 2 ký tự đầu
            // Salt tail = 2 ký tự cuối
            // CodeSumString = md5(md5(Salt head)+ md5(Tail) + md5(pass)) 
            string _pass = password;

            string _head = "";
            int _dem = 0;
            for (int i = 0; i < _pass.Length; i++)
            {
                _head += _pass[i];
                _dem++;
                if (_dem == 2)
                    break;
            }

            string _tail = "";
            _dem = 0;
            for (int i = _pass.Length - 1; i >= 0; i--)
            {
                _tail += _pass[i];
                _dem++;
                if (_dem == 2)
                    break;
            }


            // Salt head = 2 ký tự đầu
            // Salt tail = 2 ký tự cuối
            // CodeSumString = md5(md5(Salt head)+ md5(Tail) + md5(pass)) 

            DateTime _date = DateTime.Now;
            string _headsalt = CommonClass.md5(_head);
            string _tailsalt = CommonClass.md5(_tail);
            string _password = CommonClass.md5(_pass);
            string _codesumstring = CommonClass.md5(_headsalt + _tailsalt + _password); // Chuỗi password tổng hợp
            //////////////////////////////////////////////////////////////////////////////
            return _codesumstring;
        }
        #endregion

        #region Tạo mã số tự động
        private DBManager dbmanager;
        private int chieudai, index;
        private string tiento;

        /// <summary>
        /// Phương thức kiểm tra 1 ký tự có phải là số ko?
        /// </summary>
        /// <param name="kytu"></param>
        /// <returns></returns>
        public bool IsNumber(Char kytu)
        {
            if (!Char.IsDigit(kytu))
                return false;
            return true;
        }

        /// <summary>
        /// Phương thức đếm số lượng ký tự trong một chuỗi
        /// </summary>
        /// <param name="Chuoi"></param>
        /// <returns></returns>
        private int demChuoi(string Chuoi)
        {
            int dem = 0;
            for (int i = 0; i < Chuoi.Length; i++)
            {
                if (!this.IsNumber(Chuoi[i]))
                    dem++;
            }
            return dem;
        }

        /// <summary>
        /// Phương thức getTableName
        /// </summary>
        /// <param name="tablename"></param>
        /// <returns>string</returns>
        private string getTableName(string tablename)
        {
            string str = "";
            foreach (Char c in tablename)
            {
                int chuoi = Convert.ToInt32(c);
                if (chuoi >= 65 && chuoi <= 90) /* c là ký tự Hoa*/
                {
                    str += c.ToString();
                }

            }
            return str;
        }

        /// <summary>
        /// Phương thức tạo mã số tự động
        /// </summary>
        /// <param name="TableName">Tên của table trong CSDL</param>
        /// <returns>string</returns>
        public string TaoMaTuDong(string TableName)
        {
            string TableField = "Ma" + TableName;
            string table_name, congdon;
            try
            {
                dbmanager.Open();

                DataTable dt = new DataTable();

                dt = dbmanager.ExecuteDataSet(CommandType.Text, "select " + TableField + " from " + TableName).Tables[0];
                dbmanager.Close();

                List<int> lst = new List<int>();
                // Duyệt qua từng dòng của table
                foreach (DataRow rw in dt.Rows)
                {
                    string rowdata = rw[TableField].ToString();
                    chieudai = this.demChuoi(rowdata);
                    int num = Convert.ToInt32(rowdata.Substring(chieudai)); // Tách chuỗi để lấy chiều dài, kết quả trả về là chuỗi số

                    // Add vào List
                    lst.Add(num);
                }

                // Sắp xếp List và xác định chuỗi số thứ i
                SapTang(lst);

                int k = 1;
                while (k <= lst.Count)
                {
                    if (k != lst[k - 1])
                        break;
                    k++;
                }

                // Kiểm tra vượt quá giới hạn chuỗi số (10 số) hay chưa?
                index = 0;
                if (k.Equals(9999999999)) //9,999,999,999
                    // Tăng tiền tố lên                       
                    index += 1;
                // Giữ nguyên
                tiento = Convert.ToChar(index + 65) + "-";

                // Lấy các ký tự in Hoa của TableName
                table_name = this.getTableName(TableName);

                // Tìm được số thứ tự của mã số ta cộng dồn vào
                // Mã số = Tiền tố + "-" + Chuỗi số thứ tự                  

                // Cộng dồn số thứ tự k vào
                congdon = FitAdd(k);

                // Đảm bảo k thuộc (00,000,000 - 99,999,999)
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (dbmanager.Connection.State == ConnectionState.Open)
                    dbmanager.Close();
            }

            return (tiento + table_name + congdon);
        }

        private static string FitAdd(int number)
        {
            string str = "";
            int dem = Count(number);
            int n = 10 - dem;
            for (int i = 0; i < n; i++)
            {
                str += "0";
            }
            return str + number;
        }


        private static int Count(int number)
        {
            int dem = 1;
            while (number >= 10)
            {
                dem++;
                number = number / 10;
            }
            return dem;
        }

        private static void SapTang(List<int> lst)
        {
            for (int i = 0; i <= lst.Count - 2; i++)
                for (int j = i + 1; j <= lst.Count - 1; j++)
                {
                    if (lst[i] > lst[j])
                    {
                        int temp = lst[i];
                        lst[i] = lst[j];
                        lst[j] = temp;
                    }
                }
        }

        #endregion

        #region Phương thức gởi SMS tới Mobile Phone
        //public static void SendSMS(string messsage, string mobilenumber)
        //{
        //    ///SMS GATEWAY PROVIDER PATH
        //    string url = "http://XXXXProvider.com?phoneNumber={0}&MsgTxt={1}";

        //    string url1 = String.Format(url, mobilenumber, messsage);

        //    //create Web Request object for the url
        //    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url1);

        //    // get the response from the web request
        //    HttpWebResponse res = (HttpWebResponse)req.GetResponse();

        //    // read the response from the WebResponse in to a stram
        //    Stream s = res.GetResponseStream();
        //    StreamReader rdr = new StreamReader(s);
        //    string result = rdr.ReadLine();
        //    s.Flush();
        //    s.Close();
        //}
        #endregion

        #region Phương thức gởi Email
        /*
         * Các trường hợp dùng gởi mail tự động:
         * 1. Đăng ký tài khoản thành công --> Gởi mail đính kèm link để kích hoạt
         * 2. Quên mật khẩu --> Gởi mail đính kèm mật khẩu mới để người dùng đăng nhập bằng mật khẩu mới
         * 3. Thực hiện xong 1 giao dịch như: Chuyển khoản, thanh toán trực tuyến
         */
        /// <summary>
        /// Phương thức gởi mail tự động - Hàm này dùng chung cho trường hợp gởi thông báo kích hoạt - 
        /// Lấy lại mật khẩu -
        /// Mật khẩu OTP xác nhận giao dịch
        /// </summary>
        /// <param name="mailnguoinhan">string - Email của người nhận</param>
        /// <param name="code">string - Mã kích hoạt - Hoặc là mật khẩu mới</param>
        /// <param name="_case">string - Xác định trường hợp gởi email: AccountRegister(Đăng ký tài khoản mới) -  
        /// PasswordForget (Phục hồi mật khẩu) - OTPPassword (Mật khẩu OTP xác nhận giao dịch)</param>
        public static void SendEmail(string mailnguoinhan, string code, string _case)
        {
            /*------------------Phần chung----------------------------*/
            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
            SmtpClient SmtpServer = new SmtpClient();
            // username: naubank@gmail.com - password: 10413441041411
            string _emailSender = "naubank@gmail.com";
            string _passwordSender = "10413441041411";

            SmtpServer.Credentials = new System.Net.NetworkCredential(_emailSender, _passwordSender);
            SmtpServer.Port = 587;
            SmtpServer.Host = "smtp.gmail.com";
            SmtpServer.EnableSsl = true;
            mail = new System.Net.Mail.MailMessage();

            String mails = "";
            mails = mailnguoinhan;
            String dc = ConfigurationManager.AppSettings["DiaChi"];
            /*-----------------------------------------------------------------------------------------------------------*/
            try
            {
                // Trường hợp 1 - Đăng ký tài khoản mới
                if (_case == "AccountRegister")
                {
                    // Tiêu đề mail: Thông tin tài khoản tại naubank
                    mail.From = new MailAddress(_emailSender, "Thông tin tài khoản tại naubank", System.Text.Encoding.UTF8);

                    // Subject: Đăng ký tài khoản thành công
                    mail.Subject = "[NAUBBank] Đăng ký tài khoản thành công";

                    // Body:  
                    /*
                     * Chúc mừng bạn đã đăng ký thành công.\n Vui lòng truy cập vào link sau để kích hoạt tài khoản: 
                     * <a href='" + dc + "SuccessMessage.aspx?type=" + code + "'>Click vào đây để kích hoạt</a>"
                     */
                    mail.Body = "Chúc mừng bạn đã đăng ký thành công.\n Vui lòng truy cập vào link sau để kích hoạt tài khoản: <a href='" + dc + "SuccessMessage.aspx?request=" + code + "'>Click vào đây để kích hoạt</a>";
                }

                // Trường hợp 2 - Quên mật khẩu - Cần lấy lại mật khẩu mới
                else if (_case == "PasswordForget")
                {
                    // Tiêu đề mail: Lấy lại mật khẩu tại ABC Computer Online
                    mail.From = new MailAddress(_emailSender, "Lấy lại mật khẩu tại naubank", System.Text.Encoding.UTF8);

                    // Subject: Quên mật khẩu
                    mail.Subject = "[NAUBBank] Quên mật khẩu";

                    // Body:  
                    mail.Body = "Mật khẩu mới của bạn: '" + code + "'. Để đổi mật khẩu: <a href='" + dc + "Default.aspx" + "'>Trở lại trang chủ naubank</a>";
                }
                // Trường hợp 3 - Gởi mật khẩu OTP
                else if (_case == "OTPPassword")
                {
                    // Tiêu đề mail: [NAUBBank] Mật khẩu OTP - Xác nhận giao dịch
                    mail.From = new MailAddress(_emailSender, "[NAUBBank] Mật khẩu OTP - Xác nhận giao dịch", System.Text.Encoding.UTF8);

                    // Subject: Xác nhận giao dịch
                    mail.Subject = "Xác nhận giao dịch";

                    // Body:                      
                    mail.Body = "Bạn đã thực hiện một giao dịch tại ngân hàng NAUBBank. Để đảm bảo chắc chắn bạn là người thực hiện giao dịch xin hãy dùng mã OTP để xác nhận giao dịch! <br/> Mã OTP: <b>" + code + "</b> ";
                }
                // Trường hợp  - Gởi thông báo chuyển khoản thành công
                else if (_case == "ChuyenKhoan")
                {
                    // Tiêu đề mail: [NAUBBank] Giao dịch thành công
                    mail.From = new MailAddress(_emailSender, "[NAUBBank] Giao dịch chuyển khoản thành công", System.Text.Encoding.UTF8);

                    // Subject: Xác nhận giao dịch
                    mail.Subject = "Giao dịch chuyển khoản thành công";

                    // Body:                      
                    mail.Body = "Bạn đã thực hiện một giao dịch chuyển khoản tại ngân hàng NAUBBank thành công. " + code;
                }
                //

                mail.To.Add(mails);
                mail.IsBodyHtml = true;
                mail.IsBodyHtml = true;
                mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                mail.ReplyTo = new MailAddress(_emailSender);
                SmtpServer.Send(mail);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

        }
        #endregion

        #region Phương thức gởi nhiều Email 1 lúc
        /// <summary>
        /// Phương thức gởi nhiều Email 1 lúc
        /// </summary>
        /// <param name="lstEmailnguoinhan">List - Danh sách địa chỉ Email cần gởi</param>
        /// <param name="titleEmail">string - Tiêu đề Email - Ví dụ: "Thông tin tài khoản tại naubank"</param>
        /// <param name="subjectEmail">string - Chủ đề Email - Ví dụ: "[NAUBBank] Quên mật khẩu"</param>
        /// <param name="bodyEmail">string - Nội dung Email</param>
        public static void SendEmail(List<string> lstEmailnguoinhan, string titleEmail, string subjectEmail, string bodyEmail)
        {
            /*------------------Phần chung----------------------------*/
            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
            SmtpClient SmtpServer = new SmtpClient();
            // username: naubank@gmail.com - password: 10413441041411
            string _emailSender = " abonlinecomputer@gmail.com";
            string _passwordSender = "10413441041411";

            SmtpServer.Credentials = new System.Net.NetworkCredential(_emailSender, _passwordSender);
            SmtpServer.Port = 587;
            SmtpServer.Host = "smtp.gmail.com";
            SmtpServer.EnableSsl = true;
            mail = new System.Net.Mail.MailMessage();



            String dc = ConfigurationManager.AppSettings["DiaChi"];
            /*-----------------------------------------------------------------------------------------------------------*/
            try
            {

                // Tiêu đề mail: Thông tin tài khoản tại naubank
                mail.From = new MailAddress(_emailSender, titleEmail, System.Text.Encoding.UTF8);

                // Subject: Đăng ký tài khoản thành công
                mail.Subject = subjectEmail;

                // Body:  
                /*
                 * Chúc mừng bạn đã đăng ký thành công.\n Vui lòng truy cập vào link sau để kích hoạt tài khoản: 
                 * <a href='" + dc + "SuccessMessage.aspx?type=" + code + "'>Click vào đây để kích hoạt</a>"
                 */
                mail.Body = bodyEmail;
                foreach (var item in lstEmailnguoinhan)
                {
                    string _mails = item;
                    mail.To.Add(_mails); // Add list email vào để send 1 lần
                }

                mail.IsBodyHtml = true;
                mail.IsBodyHtml = true;
                mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                mail.ReplyTo = new MailAddress(_emailSender);
                SmtpServer.Send(mail);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

        }
        #endregion

        #region Phương thức tính số (Năm, Tháng, Tuần, Ngày, Giờ, Phút, Giây) trước
        /// <summary>
        /// Phương thức tính số (Năm, Tháng, Ngày, Giờ, Phút, Giây) trước
        /// </summary>
        /// <param name="date">DateTime - Ngày trước</param>
        /// <returns>string - Chuỗi đã đếm</returns>
        public static string DateTimeCount(DateTime date)
        {
            // Thuật toán:
            // Tổng ngày trước = Ngày hiện hành - Ngày trước
            string _datetimecount = null;

            DateTime _ngayhienhanh = DateTime.Now;
            // + Tính năm
            int _namcount = _ngayhienhanh.Year - date.Year; // Tính năm count


            if (_namcount > 0) // Trường hợp năm > 0
            {
                _datetimecount = _namcount.ToString() + " năm";
                return _datetimecount;
            }

            // + Tính tháng
            int _thangcount = _ngayhienhanh.Month - date.Month; // Tính tháng count
            if (_thangcount > 0) // Trường hợp tháng > 0
            {
                _datetimecount = _thangcount.ToString() + " tháng";
                return _datetimecount;
            }

            // + Tính ngày
            int _ngaycount = _ngayhienhanh.Day - date.Day; // Tính ngày count
            if (_ngaycount > 0) // Trường hợp ngày > 0
            {
                _datetimecount = _ngaycount.ToString() + " ngày";
                return _datetimecount;
            }

            // + Tính giờ 
            int _giocount = _ngayhienhanh.Hour - date.Hour; // Tính giờ count
            if (_giocount > 0) // Trường hợp ngày > 0
            {
                _datetimecount = _giocount.ToString() + " giờ";
                return _datetimecount;
            }

            // + Tính phút
            int _phutcount = _ngayhienhanh.Minute - date.Minute; // Tính phút count
            if (_phutcount > 0) // Trường hợp ngày > 0
            {
                _datetimecount = _phutcount.ToString() + " phút";
                return _datetimecount;
            }

            // + Tính giây
            int _giaycount = _ngayhienhanh.Second - date.Second; // Tính năm count
            _datetimecount = _giaycount.ToString() + " giây";


            return _datetimecount;
        }
        #endregion

        #region Định dạng hiển thị tiền tệ
        /// <summary>
        /// Định dạng hiển thị tiền tệ - Tùy theo loại tiền tệ mà có cách hiển thị khác nhau
        /// </summary>
        /// <param name="money">decimal - Số tiền cần định dạng hiển thị</param>
        /// <param name="curencytype">string - Loại tiền: VND, Dollar, Euro, Pound, AUD</param>
        /// <returns></returns>
        public static string FormatCurrency(decimal money, string curencytype)
        {
            string _money = null;
            if (money != 0)
            {
                if (curencytype == "VND")
                {
                    _money = string.Format("{0:0,0 VND}", money);
                }
                else if (curencytype == "Dollar")
                {
                    _money = string.Format("{0:0,0 $}", money);
                }
                else if (curencytype == "Euro")
                {
                    _money = string.Format("{0:0,0 €}", money);
                }
                else if (curencytype == "Pound")
                {
                    _money = string.Format("{0:0,0 £}", money);
                }
                else if (curencytype == "AUD")
                {
                    _money = string.Format("{0:0,0 AUD}", money);
                }
            }
            else // Tiền = 0
            {
                _money = "0.00" + " " + curencytype;
            }
            return _money;
        }
        #endregion

        #region FormatCurrency
        /// <summary>
        /// FormatCurrency - VD: 1000000 --> 1,000,000 vnđ
        /// </summary>
        /// <param name="objMoney">object</param>
        /// <returns>string - VD: 1000000 --> 1,000,000 vnđ</returns>
        public static string FormatCurrency(object objMoney)
        {
            //String.Format(“{0:0,0 vnđ}”, 20000000) –> kết quả sẽ là 20,000,000 vnđ. Chúc các bạn thành công.

            string _money = "";

            try
            {

                _money = string.Format("{0:0,0 vnđ}", objMoney);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return _money;
        }
        #endregion

        #region Hàm đọc số tiền tệ thành chữ
        /// <summary>
        /// Hàm đọc số tiền tệ thành chữ
        /// Tham khảo: http://www.thanhhoagroup.com/Chi-tiet/2_0_24_56_Chuyen-doi-so-thanh-chu--dung-trong-tien-te-.aspx
        /// </summary>
        /// <param name="number">decimal - Số tiền bằng số</param>
        /// <returns>string - Số tiền bằng chữ</returns>
        public static string ReadCurrencyNumberToString(decimal number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            decimal decS = 0;
            //Tung addnew
            try
            {
                decS = Convert.ToDecimal(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;
            return str + "đồng";
        }

        //public static string ToString(double number)
        //{
        //    string s = number.ToString("#");
        //    string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
        //    string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
        //    int i, j, donvi, chuc, tram;
        //    string str = " ";
        //    bool booAm = false;
        //    double decS = 0;
        //    //Tung addnew
        //    try
        //    {
        //        decS = Convert.ToDouble(s.ToString());
        //    }
        //    catch
        //    {
        //    }
        //    if (decS < 0)
        //    {
        //        decS = -decS;
        //        s = decS.ToString();
        //        booAm = true;
        //    }
        //    i = s.Length;
        //    if (i == 0)
        //        str = so[0] + str;
        //    else
        //    {
        //        j = 0;
        //        while (i > 0)
        //        {
        //            donvi = Convert.ToInt32(s.Substring(i - 1, 1));
        //            i--;
        //            if (i > 0)
        //                chuc = Convert.ToInt32(s.Substring(i - 1, 1));
        //            else
        //                chuc = -1;
        //            i--;
        //            if (i > 0)
        //                tram = Convert.ToInt32(s.Substring(i - 1, 1));
        //            else
        //                tram = -1;
        //            i--;
        //            if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
        //                str = hang[j] + str;
        //            j++;
        //            if (j > 3) j = 1;
        //            if ((donvi == 1) && (chuc > 1))
        //                str = "một " + str;
        //            else
        //            {
        //                if ((donvi == 5) && (chuc > 0))
        //                    str = "lăm " + str;
        //                else if (donvi > 0)
        //                    str = so[donvi] + " " + str;
        //            }
        //            if (chuc < 0)
        //                break;
        //            else
        //            {
        //                if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
        //                if (chuc == 1) str = "mười " + str;
        //                if (chuc > 1) str = so[chuc] + " mươi " + str;
        //            }
        //            if (tram < 0) break;
        //            else
        //            {
        //                if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
        //            }
        //            str = " " + str;
        //        }
        //    }
        //    if (booAm) str = "Âm " + str;
        //    return str + "đồng chẵn";
        //}
        #endregion

        #region Hàm tính khoảng cách 2 ngày
        /// <summary>
        /// Hàm tính khoảng cách 2 ngày
        /// </summary>
        /// <param name="x">DateTime - Ngày x</param>
        /// <param name="y">DateTime - Ngày y</param>
        /// <returns>long - Khoảng cách giữa 2 ngày x và y</returns>
        public static long KhoangCach(DateTime x, DateTime y)
        {
            long a = CommonClass.SoThuTu(x);
            long b = CommonClass.SoThuTu(y);
            return Math.Abs(a - b);
        }
        #endregion

        #region Hàm đếm số thứ tự của 1 ngày x tính từ ngày 1/1/1
        /// <summary>
        /// Hàm đếm số thứ tự của 1 ngày x tính từ ngày 1/1/1
        /// </summary>
        /// <param name="x">DateTime</param>
        /// <returns>long</returns>
        private static long SoThuTu(DateTime x)
        {
            long _stt = 0;
            for (int i = 1; i <= x.Year - 1; i++)
            {
                _stt = _stt + 365;
                //NGAY temp = { 1, 1, i };
                DateTime _temp = new DateTime(i, 1, 1);

                if (CommonClass.KiemTraNhuan(_temp.Year) == 1)
                    _stt = _stt + 1;
            }
            return (_stt + (long)x.DayOfYear);
        }
        #endregion

        #region Định dạng hiển thị số tiền bằng chữ
        /// <summary>
        /// Định dạng hiển thị số tiền bằng chữ
        /// </summary>
        /// <param name="money">decimal - Số tiền cần định dạng hiển thị chữ</param>
        /// <returns>string - Chuỗi sau khi định dạng</returns>
        public static string FormatSoTienBangChu(decimal money)
        {
            if (money <= 0)
                return "Không";

            string _rs = null;
            _rs = CommonClass.ReadCurrencyNumberToString(money);

            // Lọc khoảng trắng
            _rs = CommonClass.FilterSpace(_rs);

            // Chuyển
            _rs = CommonClass.ChangeStringToUpperCase(_rs);
            return _rs;
        }
        #endregion

        #region Phương thức lọc bỏ các khoảng trắng dư thừa trong văn bản
        /// <summary>
        /// Phương thức lọc bỏ các khoảng trắng dư thừa trong văn bản
        /// </summary>
        /// <param name="strBanDau">string - Chuỗi văn bản ban đầu</param>
        /// <returns>string - Chuỗi văn bản sau khi đã lọc bỏ các khoảng trắng</returns>
        public static string FilterSpace(string strBanDau)
        {
            string chuoi = "";
            try
            {
                // Xử lý lọc khoảng trắng thừa văn bản
                string str = strBanDau.Trim();

                List<string> lst = new List<string>();
                string[] b = str.Split(' ');

                // Thêm hết vào list
                for (int i = 0; i < b.Length; i++)
                {
                    if (!b[i].Equals(""))
                        lst.Add(b[i]);
                }

                foreach (var item in lst)
                {
                    chuoi += item;
                    chuoi += " ";
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return chuoi;
        }
        #endregion

        #region Phương thức chuyển Một chuỗi có ký tự đầu sang ký tự in HOA
        /// <summary>
        /// Phương thức chuyển Một chuỗi có ký tự đầu sang ký tự in HOA
        /// </summary>
        /// <param name="chuoibandau">string - Chuỗi ban đầu</param>
        /// <returns>string - Chuỗi sau khi đã chuyển</returns>
        public static string ChangeStringToUpperCase(string chuoibandau)
        {
            string _rs = "";

            string _headchar = chuoibandau[0].ToString().ToUpper();
            _rs += _headchar;
            for (int i = 1; i < chuoibandau.Length; i++)
            {
                _rs += chuoibandau[i];
            }
            return _rs;
        }
        #endregion

        #region Định dạng ngày tháng hiển thị đúng, bất kỳ máy tính nào cũng hiển thị đúng
        /// <summary>
        /// Phương thức định dạng ngày tháng cơ bản: dd/mm/yyyy
        /// </summary>
        /// <param name="date">DateTime</param>
        /// <returns>string</returns>
        public static string FormatShortDateTime(DateTime date)
        {
            if (date == null)
                return null;

            string _rs = null;

            // Xử lý hiển thị theo định dạng ngày tháng cơ bản: dd/MM/yyyy
            string _ngay = date.Day.ToString();
            string _thang = date.Month.ToString();
            string _nam = date.Year.ToString();
            //int _gio = date.Hour;
            //int _phut = date.Minute;
            //int _giay = date.Second;

            if (int.Parse(_ngay) < 10)
                _ngay = "0" + _ngay;
            if (int.Parse(_thang) < 10)
                _thang = "0" + _thang;

            _rs += _ngay + "/" + _thang + "/" + _nam;

            return _rs;
        }

        /// <summary>
        /// // Xử lý hiển thị theo định dạng ngày tháng cơ bản: dd/mm/yyyy : hh:mm tt AM | PM
        /// </summary>
        /// <param name="date">DateTime</param>
        /// <returns>string</returns>
        public static string FormatFullDateTime(DateTime date)
        {
            if (date == null)
                return null;

            string _rs = null;

            string _ngay = date.Day.ToString();
            string _thang = date.Month.ToString();
            string _nam = date.Year.ToString();
            string _gio = date.Hour.ToString();
            string _phut = date.Minute.ToString();
            string _giay = date.Second.ToString();

            if (int.Parse(_ngay) < 10)
                _ngay = "0" + _ngay;
            if (int.Parse(_thang) < 10)
                _thang = "0" + _thang;

            string _zone = int.Parse(_gio) > 12 ? "PM" : "AM";

            _rs += _ngay + "/" + _thang + "/" + _nam + " " + _gio + ":" + _phut + ":" + _giay + " " + _zone;

            return _rs;

        }
        #endregion

        #region Hàm tạo mã thẻ ATM, Thẻ tín dụng tự động
        /// <summary>
        /// Hàm tạo mã thẻ ATM, Thẻ tín dụng tự động 
        /// Định dạng mã thẻ ATM: Ví dụ: 6201 6001 1265 1915
        /// </summary>
        /// <returns>string</returns>
        public static string CreateCodeATMCreditCard()
        {
            string _rs = null;
            Random _rd = new Random();
            int _str1 = _rd.Next(0000, 9999);
            int _str2 = _rd.Next(1000, 8888);
            int _str3 = _rd.Next(2000, 7777);
            int _str4 = _rd.Next(3000, 6666);

            _rs += _str1.ToString() + _str2.ToString() + _str3.ToString() + _str4.ToString();

            return _rs;
        }
        #endregion

        #region Hàm tạo Số sổ tiết kiệm tự động
        /// <summary>
        /// Hàm tạo Số sổ tiết kiệm tự động
        /// Định dạng: Ví dụ: NAB123456
        /// </summary>
        /// <returns>string</returns>
        public static string CreateCodeSoTietKiem()
        {
            string _rs = null;
            Random _rd = new Random();
            int _str1 = _rd.Next(100, 999);
            int _str2 = _rd.Next(200, 888);

            _rs += "NAB" + _str1.ToString() + _str2.ToString();

            return _rs;
        }
        #endregion

        #region Hàm tạo số tài khoản thẻ ATM
        /// <summary>
        /// Hàm tạo số tài khoản thẻ ATM
        /// Định dạng số tài khoản thẻ ATM: Ví dụ: 711A 11 26 5192
        /// </summary>
        /// <returns>string</returns>
        public static string CreateSoTaiKhoanATM()
        {
            string _rs = null;

            DateTime _date = DateTime.Now;
            string _ngay = _date.Day.ToString();
            string _thang = _date.Month.ToString();
            string _nam = _date.Year.ToString();
            string _gio = _date.Hour.ToString();
            string _phut = _date.Minute.ToString();
            string _giay = _date.Second.ToString();

            // Lọc
            if (int.Parse(_ngay) < 10)
                _ngay = "0" + _ngay;
            if (int.Parse(_thang) < 10)
                _thang = "0" + _thang;
            if (int.Parse(_gio) < 10)
                _gio = "0" + _gio;
            if (int.Parse(_phut) < 10)
                _phut = "0" + _phut;
            if (int.Parse(_giay) < 10)
                _giay = "0" + _giay;

            string _nam1 = _nam.ToString().Substring(0, 2);
            string _nam2 = _nam.ToString().Substring(2, 2);

            int _tong1 = 0;
            int _tong2 = 0;
            string _nam3 = _thang.ToString();
            int _tong3 = 0;

            for (int i = 0; i < _nam1.Length; i++)
            {
                _tong1 += int.Parse(_nam1[i].ToString());
                _tong2 += int.Parse(_nam2[i].ToString());
                _tong3 += int.Parse(_nam3[i].ToString());
            }


            List<int> _lstTemp = new List<int>();
            _lstTemp.Add(_tong1);
            _lstTemp.Add(_tong2);
            _lstTemp.Add(_tong3);

            // Sắp giảm
            SapGiam(_lstTemp);


            // Cộng dồn
            //[20+12+07] [22 17 25 66]

            // rs = "nam" + "A" + "ngay_gio_phut_giay"
            string _str1 = null;
            foreach (var item in _lstTemp)
                _str1 += item.ToString();

            string _str2 = _ngay + _gio + _phut + _giay;

            _rs += _str1 + "A" + _str2;

            return _rs;
        }
        #endregion

        #region Sắp giảm
        private static void SapGiam(List<int> lst)
        {
            for (int i = 0; i <= lst.Count - 2; i++)
            {
                for (int j = i + 1; j <= lst.Count - 1; j++)
                {
                    if (lst[i] < lst[j])
                    {
                        int _temp = lst[i];
                        lst[i] = lst[j];
                        lst[j] = _temp;
                    }
                }
            }
        }

        #endregion

        #region Tạo chuỗi số ngẫu nhiên - Ngày, tháng, năm, giờ, phút, giây
        /// <summary>
        /// Tạo chuỗi số ngẫu nhiên - Ngày, tháng, năm, giờ, phút, giây
        /// Quy tắc tạo: String = Ngày + tháng + năm + giờ + phút + giây
        /// </summary>
        /// <returns>string</returns>
        public static string CreateNumberStringRandom()
        {
            DateTime _date = DateTime.Now;
            string _ngay = _date.Day.ToString();
            string _thang = _date.Month.ToString();
            string _nam = _date.Year.ToString();
            string _gio = _date.Hour.ToString();
            string _phut = _date.Minute.ToString();
            string _giay = _date.Second.ToString();

            return (_nam + _thang + _ngay + _gio + _phut + _giay);
        }
        #endregion

        #region Lọc bỏ ký tự dấu tiếng việt sang ko dấu
        /// <summary>
        /// Lọc bỏ ký tự dấu tiếng việt sang ko dấu - Tham khảo: http://www.thanhcuong.wordpress.com
        /// </summary>
        /// <param name="s">string - Chuỗi ký tự cần lọc</param>
        /// <returns>string - Chuỗi ký tự sau khi đã lọc bỏ dấu tiếng việt</returns>
        public static string ConvertToUnSign3(string s)
        {
            Regex regex = new Regex("\\p{IsCombiningDiacriticalMarks}+");
            string temp = s.Normalize(NormalizationForm.FormD);
            return regex.Replace(temp, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');
        }

        #endregion

        #region LoadTinhTrang
        /// <summary>
        /// Phương thức load tình trạng - "Đã kích hoạt" | "Chưa kích hoạt"
        /// </summary>
        /// <param name="tinhtrang">int - Giá trị field tình trạng trong CSDL</param>
        /// <returns>string</returns>
        public static string LoadTinhTrang(int tinhtrang)
        {
            return tinhtrang == 1 ? "Đã kích hoạt" : "Chưa kích hoạt";
        }

        #endregion


        #region GetEmailFromResponse
        /// <summary>
        /// GetEmailFromResponse -
        /// Ví dụ response = email=chenhchihuyckc@gmail.com&isVerified=true - 
        /// Trả về chenhchihuyckc@gmail.com
        /// </summary>
        /// <param name="response">string - Chuỗi trả về có Email</param>
        /// <returns>string - Email</returns>
        public static string GetEmailFromResponse(string response)
        {
            //email=chenhchihuyckc@gmail.com&isVerified=true
            // Xác định ký tự bắt đầu
            int _vtd = FindHeadChar(response);
            if (_vtd == -1)
                return null;

            // Xác định ký tự kết thúc
            int _vtc = FindTailChar(response);
            if (_vtc == -1)
                return null;

            string _rs = null;
            for (int i = _vtd + 1; i <= _vtc - 1; i++)
                _rs += response[i].ToString();
            return _rs;
        }

        /// <summary>
        /// Tìm vị trí bắt đầu của chuỗi email
        /// </summary>
        /// <param name="response">response</param>
        /// <returns>int</returns>
        private static int FindHeadChar(string response)
        {
            if (response == null)
                return -1;

            for (int i = 0; i < response.Length; i++)
            {
                if (response[i].ToString().Equals("="))
                    return i;
            }
            return -1;
        }


        /// <summary>
        /// Tìm vị trí kết thúc của chuỗi email
        /// </summary>
        /// <param name="response">response</param>
        /// <returns>int</returns>
        private static int FindTailChar(string response)
        {
            if (response == null)
                return -1;

            for (int i = response.Length - 1; i >= 0; i--)
            {
                if (response[i].ToString().Equals("&"))
                    return i;
            }
            return -1;
        }

        #endregion
    }
}